package com.cskaoyan.javase.oop1._6constructor._1assignment;

/**
 * 构造器的赋值,以及new对象过程中赋值手段,先总结一下
 * 目前学过的有:
 *      1.默认初始化,具有默认值
 *      2.显式赋值
 *      3.构造器赋值
 * 那么以上赋值手段,执行的顺序是什么样的?
 * (非常重要的原则)
 * 以后不管学习多少种赋值方式,在new对象过程中
 * 我们查看成员变量赋值顺序,遵循"掐头去尾"原则:
 *      1."默认初始化,具有默认值"永远最先执行
 *      2."构造器赋值"永远最后执行
 *
 * 那么在以上三种赋值手段中,显式赋值要在中间执行了
 * 日常学习开发中,我们可以用IDEA的debug模式查看成员变量赋值顺序.
 *
 * 在new对象过程中,程序可控的,可以查看的执行流程是:
 * <init>方法的执行,也就是这个类的构造器执行
 * 构造器的执行,从方法栈帧上来说,表现为该类的<init>方法栈帧进栈
 *
 * 总结:
 *      1.new对象时使用哪个构造器,debug模式下就会先跳转到该构造器
 *          也就是该构造器的方法栈帧先进栈
 *      2.如果该构造器首行调用了其它构造器,那么就会先跳转到其它构造器
 *          体现为其它构造器的方法栈帧进栈
 *      3.接下来执行显式赋值,并且在一次new对象过程中,显式赋值最多执行一次
 *      4.依赖于栈的先进后出,决定构造器代码的执行流程
 *
 * @since 10:11
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s = new Student(20000);
        Student s2 = new Student(8888, "张三");
    }
}

class Student {
    double salary = 10000;
    String name;

    public Student() {
        // 无参构造器new对象,需要一个复杂的逻辑完成
        init();
    }

    public void init(){
        // 对应执行的代码
    }

    public Student(double salary) {
        this.salary = salary;
    }

    public Student(double salary, String name) {
        this(salary);
        this.name = name;
    }

}